home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / foomatic-extract-text < prev    next >
Text File  |  2009-09-18  |  5KB  |  190 lines

  1. #!/usr/bin/perl -w   # -*- perl -*-
  2.  
  3. use Foomatic::Defaults;
  4. use Foomatic::DB;
  5. use strict;
  6.  
  7. sub write_po{
  8.     my ($out, $messages) = @_;
  9.     foreach (sort(keys %$messages)) {
  10.     if ($_ eq '') {
  11.         next;
  12.     }
  13.     my $translation = $messages->{$_};
  14.     print $out "msgid \"$_\"\nmsgstr \"$translation\"\n\n";
  15.     }
  16. }
  17.  
  18. sub write_message_files {
  19.     my ($messages) = @_;
  20.  
  21.     foreach (keys %$messages) {
  22.     print "LANGUAGE: $_\n";
  23.     open my $out, ">:encoding(utf-8)", "$_.po" or die;
  24.     write_po($out, $messages->{$_});
  25.     }
  26. }
  27.  
  28. sub extract_ppd_old{
  29.     my $file = $_[0];
  30.     my %messages;
  31.  
  32.  
  33.     if ($file =~ /ppd\.gz$/) {
  34.     open(FILE, "zcat $file |") or die "Can't open file: $file";
  35.     } else {
  36.     open(FILE, $file);
  37.     } 
  38.  
  39.     while (<FILE>){
  40.     if ( /\*(\w+) (\w+)\/([^:]+): \"([^\"]*)\"/ ) {
  41.         print $_, "'$1' '$2' '$3' '$4'\n\n"
  42.     }
  43.     #print
  44.     }
  45.     close FILE;
  46. }
  47.  
  48.  
  49. sub extract_from_db{
  50.     my $messages = $_[0];
  51.  
  52.     my $db = Foomatic::DB->new();
  53.  
  54.     my @files = $db->_get_xml_filelist("source/opt");
  55.     foreach my $file (@files){
  56.     if ( $file =~ /[Mm]odel|^18$|^57$/ ) { 
  57.         next; 
  58.     }
  59.     my $xml = $db->_get_object_xml("source/opt/$file");
  60.     while ($xml =~ /\<[^\<\/]*longname\>.*?\<en\>(.*?)\<\/en\>/sg) {
  61.         my $message = Foomatic::DB::unhtmlify($1); # xml unquoting
  62.         $messages->{$message} = '';
  63.     }
  64.     }
  65. }
  66.  
  67. sub extract_ppd{
  68.     my ($db, $messages) = @_;
  69.     my $args = $db->{"dat"}{"args_byname"};
  70.  
  71.     for my $option (keys %$args){
  72.     $messages->{$args->{$option}{"comment"}} = "";
  73.     #foreach (keys %{$args->{$option}}) {
  74.     #    print $_, "\n";
  75.     #}
  76.     if ($args->{$option}{"type"} eq "bool"){
  77.         $messages->{$args->{$option}{"comment_true"}} = '';
  78.         $messages->{$args->{$option}{"comment_false"}} = '';
  79.     } elsif ($args->{$option}{"type"} eq "enum") {
  80.         for my $val (@{$args->{$option}{"vals"}}){
  81.         $messages->{$val->{"comment"}} = '';
  82.         }
  83.     }
  84.     }
  85.     return;
  86.     # old code:
  87.     $a = $db->{"dat"}{"args_byname"}{"MediaType"}{"vals"}[0];
  88.     print "$a\n\n";
  89.     if (0){
  90.         foreach my $val (@$a){
  91.             print "$val\n";
  92.         }
  93.         return;
  94.     }
  95.     foreach my $name (keys %$a) {
  96.     print "$name:\n";
  97.     print $a->{$name}, "\n\n";
  98.     if ($name != "compiled-at"){
  99.         foreach (keys %{$db->{"dat"}{$name}}) {
  100.         print $_, "\n";
  101.         }
  102.         print "\n";
  103.     }
  104.     }
  105. }
  106.  
  107. sub get_translated_messages{
  108.     my ($ppd_en, $ppd_lang, $translation) = @_;
  109.  
  110.     my $args_en = $ppd_en->{"dat"}{"args_byname"};
  111.     my $args_lang = $ppd_lang->{"dat"}{"args_byname"};
  112.  
  113.     for my $option (keys %$args_en){
  114.     $translation->{$args_en->{$option}{"comment"}} = 
  115.         $args_lang->{$option}{"comment"};
  116.  
  117.     if ($args_en->{$option}{"type"} eq "bool"){
  118.         $translation->{$args_en->{$option}{"comment_true"}} = 
  119.         $args_lang->{$option}{"comment_true"}; 
  120.         $translation->{$args_en->{$option}{"comment_false"}} =  
  121.         $args_lang->{$option}{"comment_false"};
  122.     } elsif ($args_en->{$option}{"type"} eq "enum") {
  123.         for my $val (@{$args_en->{$option}{"vals"}}){
  124.         my $value = $val->{"value"};
  125.         for my $val_lang (@{$args_lang->{$option}{"vals"}}){
  126.             if ($val_lang->{"value"} eq $value) {
  127.             $translation->{$val->{"comment"}} = 
  128.                 $val_lang->{"comment"};
  129.             };
  130.         }
  131.         }
  132.     }
  133.     }
  134. }
  135.  
  136. sub extract_ppds{
  137.     my ($path, $messages) = @_;
  138.     my $ppds = { };
  139.     my %language_names = ('English' => 'en',
  140.               'French' => 'fr',
  141.               'German' => 'de',
  142.               'Italian' => 'it',
  143.               'Japanese' => 'jp',
  144.               'Portugse' => 'pt',
  145.               'Portuguese' => 'pt',
  146.               'Spanish' => 'es');
  147.  
  148.     # read ppds
  149.     open(PPDS, "find $path -name \*.ppd\*|");
  150.     while (<PPDS>){
  151.     print substr($_, 0, -1), "\n";
  152.     my $db = Foomatic::DB->new();
  153.     $db->getdatfromppd(substr($_, 0, -1));
  154.     my $makemodel = $db->{'dat'}{'makemodel'};
  155.     $ppds->{$makemodel} = [] unless exists $ppds->{$makemodel};
  156.     push @{$ppds->{$makemodel}}, $db;
  157.     }
  158.     foreach my $makemodel (keys %$ppds) {
  159.     my $en_ppd;
  160.     foreach my $ppd (@{$ppds->{$makemodel}}) {
  161.         if ($ppd->{'dat'}{'language'} eq 'English') {
  162.         $en_ppd = $ppd;
  163.         last;
  164.         }
  165.     }
  166.     foreach my $ppd (@{$ppds->{$makemodel}}) {
  167.         my $lang = $ppd->{'dat'}{'language'};
  168.         if (exists $language_names{$lang}) {
  169.         $lang = $language_names{$lang};
  170.         }
  171.         $messages->{$lang} = {} unless exists $messages->{$lang};
  172.         if ($lang ne 'en') {
  173.         get_translated_messages($en_ppd, $ppd, $messages->{$lang});
  174.         } else {
  175.         extract_ppd($ppd, $messages->{$lang});
  176.         }
  177.     }
  178.     }
  179. }
  180.  
  181. sub main{
  182.     my $messages = { };
  183.     $messages->{'en'} = { }; 
  184.     extract_from_db($messages->{'en'});
  185.     extract_ppds("$libdir/db/source/PPD/", $messages);
  186.     write_message_files($messages);
  187. }
  188.  
  189. main();
  190.